#ifndef __FS_MACHINE_H__
#define __FS_MACHINE_H__

#include "BaseType.h"
#include <map>
/**
 * @file FSMachine.h
 * @brief 状态机
 * @code 用法
 *    //状态机用法:
 *    //1.首先实例化StateHandler,在handleState处理状态及控制状态的切换setState(state)
 *    //2.将状态处理器注册到状态机
 *    //3.设置初始状态,启动状态机.
 *    FSMachine stateMachine;
 *    AStateHandler stateA;
 *    BStateHandler stateB;
 *    stateMachine.registerState(0,stateA);
 *    stateMachine.registerState(1,stateB);
 *    stateMachine.setState(0);
 * @endcode 
 */

namespace libemb{

class FSMachine;
/**
 * @class FSHandler 
 * @brief 状态处理器
 */
class FSHandler{
DECL_CLASSNAME(FSHandler)
public:
    FSHandler();
    virtual ~FSHandler();
    /**
     * @brief 处理状态的函数
     * @note 每一个子类都必须实现该方法
     */
    virtual void handleState()=0;
protected:
    /**
     * @brief 设置状态
     * @param stateID 
     * @note 用于切换到下一个状态
     */
    void setState(int stateID);
private:
    void setMachine(FSMachine& machine);
private:
    friend class FSMachine;
    FSMachine* m_stateMachine;
};

/**
 * @class FSMachine 
 * @brief 状态机
 */
class FSMachine{
DECL_CLASSNAME(FSMachine)
public:
    FSMachine();
    virtual ~FSMachine();
    /**
     * @brief 注册状态处理器
     * @param stateID 
     * @param stateHandler 
     * @return true 
     * @return false 
     */
    bool registerState(int stateID,FSHandler& stateHandler);
    /**
     * @brief 设置当前状态
     * @param stateID 
     */
    void setState(int stateID);
    /**
     * @brief 获取当前状态
     * @return int 
     */
    int getState();
private:
    int m_currState{0};
    std::map<int,FSHandler*> m_stateHandlerMap;
};

}

#endif
